package com.belizer.springboot.demos.util;

import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

public class WaterMarkUtil {

    public static void main(String[] args) {
        try {

            for (int i = 0; i < 4; i++) {

//                long currentTime = System.currentTimeMillis();

                File file = new File("C:\\Users\\topnet\\Desktop\\input\\"+i+".jpeg");
                BufferedImage image = ImageIO.read(file);
                addTextWaterMark(image, Color.RED, 80, "测试文本水印" + i, "C:\\Users\\topnet\\Desktop\\out\\"+i + ".jpeg");

//                System.out.println("图片加水印并导出耗时:" + (System.currentTimeMillis()-currentTime) + "ms");
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *
     * 添加文字水印
     *
     * @param targetImg 由文件转换的BufferedImage对象，要加水印的对象
     * @param textColor 文字颜色
     * @param fontSize 文字大小
     * @param text 水印文字
     * @param outPath 添加水印后的文件输出位置
     */
    public static void addTextWaterMark(BufferedImage targetImg, Color textColor, int fontSize, String text, String outPath) {
        try {
            BufferedImage bufferedImage = addTextWaterMark(targetImg, textColor, fontSize, text);

            //输出文件到指定位置
            FileOutputStream outImgStream = new FileOutputStream(outPath);
            ImageIO.write(bufferedImage, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *
     * 添加文字水印（使用压缩）
     *
     * @param targetImg 由文件转换的BufferedImage对象，要加水印的对象
     * @param textColor 文字颜色
     * @param fontSize 文字大小
     * @param text 水印文字
     * @param outPath 添加水印后的文件输出位置
     */
    public static void addTextWaterMarkWithThumbnailator(BufferedImage targetImg, Color textColor, int fontSize, String text, String outPath) {
        try {
            BufferedImage bufferedImage = addTextWaterMarkWithThumbnailator(targetImg, textColor, fontSize, text);

            //输出文件到指定位置
            FileOutputStream outImgStream = new FileOutputStream(outPath);
            ImageIO.write(bufferedImage, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *
     * 添加文字水印
     *
     * @param targetImg 由文件转换的BufferedImage对象，要加水印的对象
     * @param textColor 文字颜色
     * @param fontSize 文字大小
     * @param text 水印文字
     *
     * @return BufferedImage类型的添加水印后的图片
     *
     */
    public static BufferedImage addTextWaterMark(BufferedImage targetImg, Color textColor, int fontSize, String text) {

        long currentTime = System.currentTimeMillis();

        int width = targetImg.getWidth(); //图片宽
        int height = targetImg.getHeight(); //图片高
        // imageType ?
        BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
        //创建画图工具 Graphics2D
        Graphics2D g = bufferedImage.createGraphics();
        //把原始图片放入画图工具
        g.drawImage(targetImg, 0, 0, width, height, null);

        System.out.println("把原始图片放入画图工具耗时：" + (System.currentTimeMillis()-currentTime) + "ms");

        //设置画笔颜色以及文字使用的字体，此处以微软雅黑为例
        g.setColor(textColor); //水印颜色
        g.setFont(new Font("微软雅黑", Font.ITALIC, fontSize));
        // 水印内容放置在右下角
        // x坐标 =  图片宽 - 字体大小 * (字符个数 + 1)
        // 即水印文字最右边离图片右边还有一个文字大小的距离
        int x = width - (text.length() + 1) * fontSize;
        // y坐标 = 图片高 - 字体大小 * 2
        // 即水印文字最底端离图片下边还有两个文字大小的距离
        int y = height- fontSize * 2;
        //绘制水印
        g.drawString(text, x, y);

        System.out.println("绘制水印耗时：" + (System.currentTimeMillis()-currentTime) + "ms");

        //释放画图资源
        g.dispose();

        return bufferedImage;

    }

    /**
     *
     * 添加文字水印(使用压缩)
     *
     * @param targetImg 由文件转换的BufferedImage对象，要加水印的对象
     * @param textColor 文字颜色
     * @param fontSize 文字大小
     * @param text 水印文字
     * @return BufferedImage类型的添加水印后的图片
     */
    public static BufferedImage addTextWaterMarkWithThumbnailator(BufferedImage targetImg, Color textColor, int fontSize, String text) {
        long currentTime = System.currentTimeMillis();
        float quality = 0.2f;
        BufferedImage bufferedImage = null;

//        try {
//            BufferedImage compressImg = Thumbnails.of(targetImg)
//                    //缩放大小
//                    .scale(1f)
//                    //输出质量 0-1 约靠近1，图片质量越接近原图
//                    .outputQuality(quality)
//                    .asBufferedImage();
//
//            System.out.println("压缩耗时：" + (System.currentTimeMillis()-currentTime) + "ms");
//
//            bufferedImage = addTextWaterMark(compressImg, textColor, fontSize, text);
//        }catch (Exception e) {
//            e.printStackTrace();
//        }

        return bufferedImage;

    }


}
